/*
    simplecookbook  -  simplecookbook.ingredientes.RepositorioIngredientesSQLiteDataBase.java
                             -------------------
    begin                : 08/10/2008
    copyright            : (C) 2008 by cristovao
    email                : cristovao.wollieson@gmail.com
 ***************************************************************************/

/*
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful, but   *
 *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
 *   General Public License for more details.                              *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,   *
 *   MA  02111-1307 USA                                                    *
 ***************************************************************************/

/**
 * Pacote responsavel pelo controle de ingredientes do sistema
 * 
 * @author cristovao
 */
package org.ybacoby.simplecookbook.ingredientes;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.ybacoby.simplecookbook.database.EnumTabelaDataBase;
import org.ybacoby.simplecookbook.database.IDataBase;
import org.ybacoby.simplecookbook.database.IRepositorioDatabase;
import org.ybacoby.simplecookbook.exception.SimpleCookBookException;



/**
 * Para controlar os dados de ingredientes no banco de dados
 * SQLite
 * 
 * @author cristovao
 *
 */
public class RepositorioIngredientesSQLiteDataBase implements IRepositorioDatabase<Ingredientes> {

	/**
	 * O Banco de dados que ira se comunicar
	 */
	private IDataBase database;
	
	/**
	 * Constructor
	 * 
	 * @param database O banco de dados para a comunicacao
	 */
	public RepositorioIngredientesSQLiteDataBase(IDataBase database) {
		this.database = database;
	}

	/**
	 * @see simplecookbook.ingredientes.IRepositorioIngredientes#adicionar(org.ybacoby.simplecookbook.ingredientes.Ingredientes)
	 */
	public void adicionar(Ingredientes ingrediente) throws SimpleCookBookException {
		
		// Preparando o comando sql que sera inserido
		String sql = "INSERT INTO INGREDIENTES (DC_INGREDIENTE, QTD_INGREDIENTE, CD_RECEITA) "
				+ "VALUES ('"
				+ ingrediente.getDescricao() +"', '"
				+ingrediente.getQtd()+"', "
				+ingrediente.getReceita()+");";
		
		/*String sql = "insert into ingredientes (cd_ingredientes, ds_ingrediente, qtd_ingrediente, cd_receita) "
			+ "VALUES (" + ingrediente.getCodigo() + ", '"
			+ ingrediente.getDescricao() +"', '"
			+ingrediente.getQtd()+"', "
			+ingrediente.getReceita()+");";*/
		
		// Inserindo os dados objetos no banco de dados
		this.database.insertSqlDatabase(sql);

	}

	/**
	 * @see simplecookbook.ingredientes.IRepositorioIngredientes#alterar(org.ybacoby.simplecookbook.ingredientes.Ingredientes)
	 */
	public void alterar(Ingredientes ingrediente) throws SimpleCookBookException {
		// Preparando o comando sql que sera inserido
		String sql = "UPDATE INGREDIENTES SET DC_INGREDIENTE='"
		+ ingrediente.getDescricao() +"', QTD_INGREDIENTE='"
		+ ingrediente.getQtd() +"', CD_RECEITA='"
		+ ingrediente.getReceita() +"' WHERE CD_INGREDIENTE="
		+ ingrediente.getCodigo() +";";
		
		// Inserindo os dados objetos no banco de dados
		this.database.insertSqlDatabase(sql);

	}

	/**
	 * @see simplecookbook.ingredientes.IRepositorioIngredientes#excluir(org.ybacoby.simplecookbook.ingredientes.Ingredientes)
	 */
	public void excluir(Ingredientes ingrediente) throws SimpleCookBookException {
		
		// Caso so se tenha apenas a chave extrangeira de receitas
		String sql = "DELETE FROM INGREDIENTES WHERE CD_RECEITA="
			+ingrediente.getReceita()+";";
		
		// Mas caso a receita tenha um codigo so sera deletada apenas aquela referida receita
		if (ingrediente.getCodigo() != null) 
			sql = "DELETE FROM INGREDIENTES WHERE CD_INGREDIENTE=" 
				+ingrediente.getCodigo()+";";
		
		// Inserindo os dados objetos no banco de dados
		this.database.insertSqlDatabase(sql);

	}

	/**
	 * @see simplecookbook.ingredientes.IRepositorioIngredientes#procurar(org.ybacoby.simplecookbook.ingredientes.Ingredientes)
	 */
	public ArrayList<Ingredientes> procurar(Ingredientes ingrediente)
			throws SimpleCookBookException {
		// Preparando o comando sql para busca default
		String sql = "SELECT * FROM INGREDIENTES WHERE CD_RECEITA ="
			+ ingrediente.getReceita() +";";
		
		// Criando o objeto ArrayList para receber todos os ingredientes
		ArrayList<Ingredientes> ingredientes = new ArrayList<Ingredientes>();
		
		// Verificando se existe algum valor no parametro do metodo
		if (ingrediente.getCodigo() != null) sql = "SELECT * FROM INGREDIENTES WHERE CD_INGREDIENTE="
			+ ingrediente.getCodigo() +";";
		else if (ingrediente.getQtd() != null) sql = "SELECT * FROM INGREDIENTES WHERE QTD_INGREDIENTE= '"
			+ ingrediente.getQtd() +"' and CD_RECEITA="
			+ ingrediente.getReceita() +";";

		// Recebendo todos os dados na pesquisa em sql
		ResultSet rs = this.database.selectSqlDatabase(sql);

		// Verificando se todos os valores estao sendo recebidos juntamente com seus valores nulos
		try {
			while (rs.next()) {
				
				// Criando um objeto do tipo Ingredientes para ser sempre introduzido no array
				Ingredientes ingredienteReturn = new Ingredientes();
				
				// Pegando dados de Ingredientes
				ingredienteReturn.setCodigo(rs.getString("CD_INGREDIENTE"));
				ingredienteReturn.setDescricao(rs.getString("DC_INGREDIENTE"));
				ingredienteReturn.setQtd(rs.getString("QTD_INGREDIENTE"));
				ingredienteReturn.setReceita(rs.getString("CD_RECEITA"));
				
				// Adicionando ao array de ingredientes
				ingredientes.add(ingredienteReturn);
			}
		} catch (SQLException e) {
			throw new SimpleCookBookException();
		}
		
		// Retornando o array de ingredientes do banco de dados
		return ingredientes;
	}

	/**
	 * @see simplecookbook.ingredientes.IRepositorioIngredientes#totalIngredientes()
	 */
	public int totalItens() throws SimpleCookBookException {
		return this.database.totalItensDataSql(EnumTabelaDataBase.INGREDIENTE);
	}

}
